<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>01_异常处理-默认错误处理</title>
  <!-- 
  在 JavaScript 中，异常处理是确保代码在运行时能够优雅地处理错误的重要机制。默认的错误处理方式涉及到抛出错误和捕获错误的基本概念。
  1. 错误类型
  JavaScript 中有多种内置的错误类型，常见的包括：
  - SyntaxError：语法错误，通常在代码解析时发生。
  - ReferenceError：引用错误，访问未定义的变量时抛出。
  - TypeError：类型错误，操作不适合数据类型时抛出。
  - RangeError：范围错误，数字超出有效范围时抛出。
  - EvalError：与  `eval`  函数相关的错误。

  2. 抛出错误

  在 JavaScript 中，可以使用  `throw`  语句手动抛出错误。这可以用于自定义错误处理逻辑。

  示例代码：
  function divide(a, b) {
      if (b === 0) {
          throw new Error("Division by zero is not allowed.");
      }
      return a / b;
  }

  try {
      console.log(divide(10, 0));
  } catch (error) {
      console.error("Caught an error:", error.message);
  }
  3. 捕获错误

  使用  `try...catch`  语句可以捕获运行时错误，从而防止程序崩溃。 `try`  块中放置可能抛出错误的代码，而  `catch`  块用于处理错误。

  示例代码：
  try {
      // 可能抛出错误的代码
      let result = divide(10, 0);
      console.log(result);
  } catch (error) {
      console.error("An error occurred:", error.message);
  }
  4. finally 语句

  `finally`  语句用于定义无论是否发生错误都要执行的代码。它通常用于清理操作，比如关闭文件或释放资源。

  示例代码：
  try {
      // 可能抛出错误的代码
      console.log(divide(10, 2));
  } catch (error) {
      console.error("An error occurred:", error.message);
  } finally {
      console.log("This will always run.");
  }
  5. 总结

  - 默认错误处理：JavaScript 提供了内置的错误类型和  `try...catch`  机制来处理运行时错误。
  - 抛出错误：可以通过  `throw`  语句手动抛出错误，以便进行自定义处理。
  - 捕获错误：使用  `try...catch`  语句可以捕获并处理错误，防止程序崩溃。
  - 清理操作： `finally`  语句用于执行清理代码，无论是否发生错误。

  理解 JavaScript 的异常处理机制对于编写健壮的代码至关重要，能够帮助开发者有效地管理错误并提高代码的可维护性。
  -->
</head>
<body>

  <script>
    // 1. 遇到错误时，默认的错误处理机制会停止代码的执行，并显示一个错误消息。
    // 使用要抛出错误的代码.
    // function foo() {
    //   "abc".forEach()
    //   console.log("This will not be executed.");
    // }
    // foo()

    // 2. 抛出错误
    function divide(a, b) {
      if (b === 0) {
        throw new Error("Cannot divide by zero.");
      }
      return a / b;
    }
    try {
      let result = divide(10, 0);
      console.log(result);
    } catch (error) {
      console.error("An error occurred:", error.message);
    }

    divide(10, 0);

    // 3. 捕获错误
    function catchFn(a, b) {
      try {
        let result = divide(a, b);
        console.log(result);
      } catch (error) {
        console.error("An error occurred:", error.message);
      } finally {
        console.log("This will always run.");
      }
    }

    catchFn(10, 2)

    // 4.自己封装一些工具
    function sum(num1, num2) {
      if (typeof num1 !== "number") {
        throw "type error: num1传入的类型有问题, 必须是number类型"
      }

      if (typeof num2 !== "number") {
        throw "type error: num2传入的类型有问题, 必须是number类型"
      }

      return num1 + num2
    }

    // 李四调用
    const result = sum(123, 321)


  </script>
  
</body>
</html>